// 返回 s 字典序最小的子序列，该子序列包含 s 的所有不同字符，且只包含一次。

// 示例 1：
// 输入：s = "bcabc"
// 输出："abc"

// 示例 2：
// 输入：s = "cbacdcbc"
// 输出："acdb"

// 提示：
//     1 <= s.length <= 1000
//     s 由小写英文字母组成
/**
 * @param {string} s
 * @return {string}
 */
 var smallestSubsequence = function(s) {
    let countMap = new Map();
    for(let v of s) {
        if (countMap.has(v)) {
            countMap.set(v, countMap.get(v) + 1);
        } else {
            countMap.set(v, 1);
        }
    }
    let stack = [];
    for(let v of s) {
        countMap.set(v, countMap.get(v) - 1);
        if (stack.includes(v) === false) {
            let stackLen = stack.length;
            while(stackLen-- && stack[stackLen] > v && countMap.get(stack[stackLen])) {
                stack.pop();
            }
            stack.push(v);
        }
    }
    return stack.join('');
};

